运用sklearn的K 您所在的位置:网站首页 python kmeans sklearn 运用sklearn的K

运用sklearn的K

#运用sklearn的K| 来源: 网络整理| 查看: 265

现以淘宝双11后的几日脱敏数据作为研究对象,运用机器学习的K均值方法,得出“最有价值用户”。

import numpy as np # 导入NumPy import pandas as pd # 导入Pandas import matplotlib.pyplot as plt # 导入Matplotlib 的pyplot 模块 import seaborn as sns # 导入Seaborn plt.rcParams["font.family"]=['SimHei'] #用来设定字体样式 plt.rcParams['font.sans-serif']=['SimHei'] #用来设定无衬线字体样式 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 df_sales = pd.read_excel('D:\\电商历史订单.xlsx') # 载入数据集 df_sales.head() # 输出前几行数据import numpy as np # 导入NumPy import pandas as pd # 导入Pandas import matplotlib.pyplot as plt # 导入Matplotlib 的pyplot 模块 import seaborn as sns # 导入Seaborn plt.rcParams["font.family"]=['SimHei'] #用来设定字体样式 plt.rcParams['font.sans-serif']=['SimHei'] #用来设定无衬线字体样式 plt.rcParams['axes.unicode_minus']=False #用来正常显示负号 df_sales = pd.read_excel('D:\\电商历史订单.xlsx') # 载入数据集 df_sales.head() # 输出前几行数据df_sales.describe() #df_sales 的统计信息

df_sales=df_sales.drop_duplicates()#去除重复行 df_sales.isnull().any()#查找是否存在空值df_sales['dates'] = pd.to_datetime(df_sales['dates']) df_sales['dates'] = df_sales[(df_sales['dates']='2021-11-25')]#筛选出时间在(2021-11-25,2021-12-03)的数据 df_user = pd.DataFrame(df_sales['user_id'].unique()) # 生成以“user_id”为主键的对象df_user df_user.columns = ['user_id'] # 设定字段名 df_user = df_user.sort_values(by='user_id',ascending=True).reset_index(drop=True) # 按“user_id”排序 df_user # 输出df_userdf_sales['datetime'] = pd.to_datetime(df_sales['datetime']) # 转化日期格式 df_recent_buy = df_sales.groupby('user_id'). datetime.max().reset_index() # 构建消费日期信息 df_recent_buy.columns = ['user_id','最近日期'] # 设定字段名 df_recent_buy['R值'] = (df_recent_buy['最近日期'].max() - df_recent_buy['最近日期']).dt.days # 计算最新日期距上次消费日期的天数 df_user = pd.merge(df_user, df_recent_buy[['user_id','R值']], on='user_id') # 把上次消费日期距最新日期的天数(R 值)合并至df_user 对象 df_userdf_user['R值'].plot(kind='hist', bins=20, title = '新进度分布直方图') #R值直方图from sklearn.cluster import KMeans # 导入KMeans 模块 def show_elbow(df): #定义手肘函数 distance_list = [] #聚质心的距离(损失) K = range(1,9) #K值范围 for k in K: kmeans = KMeans(n_clusters=k, max_iter=100) #创建KMeans模型 kmeans = kmeans.fit(df) #拟合模型 distance_list.append(kmeans.inertia_) #创建每个K值的损失 plt.plot(K, distance_list, 'bx-') #绘图 plt.xlabel('k') #X轴 plt.ylabel('距离均方误差') #Y轴 plt.title('k值手肘图') #标题 show_elbow(df_user[['R值']]) #显示R值聚类K值手肘图kmeans = KMeans(n_clusters=3) # 设定K =3 kmeans.fit(df_user[['R值']]) # 拟合模型 df_user['R值层级'] = kmeans.predict(df_user[['R值']]) # 通过聚类模型求出R 值的层级 df_user df_user.groupby('R值层级')['R值'].describe() #R 值层级分组统计信息# 为聚类排序 def order_cluster(cluster_name, target_name,df,ascending=False): new_cluster_name = 'new_' + cluster_name # 新的聚类名称 df_new = df.groupby(cluster_name)[target_name].mean().reset_index() # 按聚类结果分组,创建df_new对象 df_new = df_new.sort_values(by=target_name,ascending=ascending).reset_index(drop=True) # 排序 df_new['index'] = df_new.index # 创建索引字段 df_new = pd.merge(df,df_new[[cluster_name,'index']], on=cluster_name) # 基于聚类名称把df_new 还原为df对象,并添加索引字段 df_new = df_new.drop([cluster_name],axis=1) # 删除聚类名称 df_new = df_new.rename(columns={"index":cluster_name}) # 将索引字段重命名为聚类名称字段 return df_new # 返回排序后的df_new 对象 df_user = order_cluster('R值层级', 'R值', df_user, False) # 调用簇排序函数 df_user = df_user.sort_values(by='user_id',ascending=True).reset_index(drop=True) # 根据用户码排序 df_user.head() # 输出前几行数据show_elbow(df_user[['F值']]) #显示F值聚类K值手肘图kmeans = KMeans(n_clusters=4) #设定K=4 kmeans.fit(df_user[['F值']]) #拟合模型 df_user['F值层级'] = kmeans.predict(df_user[['F值']]) #通过聚类模型求出F值的层级 df_user = order_cluster('F值层级', 'F值',df_user,True) #调用簇排序函数 df_user.groupby('F值层级')['F值'].describe() #F值层级分组统计信息df_user = df_user.sort_values(by='user_id',ascending=True).reset_index(drop=True) # 根据“user_id”排序 df_user.head()df_revenue = df_sales.groupby('user_id').df_sales = df_sales[df_sales['behavior_type']=='buy'].reset_index()# 根据消费次数构建df_revenue 对象 df_revenue = df_revenue[['user_id','behavior_type']] df_revenue = df_revenue.groupby(['user_id'])['behavior_type'].count() df_revenue.columns = ['user_id','M值'] # 设定字段名称 df_user = pd.merge(df_user, df_revenue, on='user_id') # 把消费金额整合至df_user 对象 df_user.head() # 输出前几行数据 df_user = df_user.rename(columns={'behavior_type':'M值'}) plt.hist(df_user['M值'],bins=50) #M 值直方图show_elbow(df_user[['M值']]) # 输出M 值聚类K 值手肘图kmeans = KMeans(n_clusters=4) # 设定K =4 kmeans.fit(df_user[['M值']]) # 拟合模型 df_user['M值层级'] = kmeans.predict(df_user[['M值']]) # 通过聚类模型求出M 值的层级 df_user = order_cluster('M值层级', 'M值',df_user,True) # 调用簇排序函数 df_user.groupby('M值层级')['M值'].describe() #M 值层级分组统计信息df_user = df_user.sort_values(by='user_id',ascending=True).reset_index(drop=True) # 根据“user_id”排序 df_user.head() # 输出前几行数据df_user['总分'] = df_user['R值层级'] + df_user['F值层级'] + df_user['M值层级'] # 求出每个用户RFM 总分 df_user # 输出df_userdf_user.query("总分 < 2 & 总分 > 0")['总体价值'] = '低价值' df_user.query("总分 < 4 & 总分 > 2")['总体价值'] = '中价值' df_user.query("总分 < 6 & 总分 > 4")['总体价值'] = '高价值' df_user # 输出df_user 对象# 在df_user 对象中添加“总体价值”字段 df_user.loc[(df_user['总分']=0), '总体价值'] = '低价值' df_user.loc[(df_user['总分']=3), '总体价值'] = '中价值' df_user.loc[(df_user['总分']=5), '总体价值'] = '高价值' df_user # 输出df_user 对象# 输出高、中、低价值用户的分布散点图(F 值与M 值) plt.scatter(df_user.query("总体价值 == '高价值'")['F值'], # 五角星代表高价值用户 df_user.query("总体价值 == '高价值'")['M值'],c='g',marker='*') plt.scatter(df_user.query("总体价值 == '中价值'")['F值'], # 圆点代表中价值用户 df_user.query("总体价值 == '中价值'")['M值'],marker=8) plt.scatter(df_user.query("总体价值 == '低价值'")['F值'], # 三角形代表低价值用户 df_user.query("总体价值 == '低价值'")['M值'],c='r')plt.figure(figsize=(6,6)) # 图片大小 ax = plt.subplot(111, projection='3d') # 坐标系 ax.scatter(df_user.query("总体价值 == '高价值'")['R值'], # 散点图 df_user.query("总体价值 == '高价值'")['F值'], df_user.query("总体价值 == '高价值'")['M值'], c='g',marker='*') ax.scatter(df_user.query("总体价值 == '中价值'")['R值'], df_user.query("总体价值 == '中价值'")['F值'], df_user.query("总体价值 == '中价值'")['M值'], marker=8) ax.scatter(df_user.query("总体价值 == '低价值'")['R值'], df_user.query("总体价值 == '低价值'")['F值'], df_user.query("总体价值 == '低价值'")['M值'], c='r') ax.set_xlabel('R值') # 坐标轴 ax.set_ylabel('F值') # 坐标轴 ax.set_zlabel('M值') # 坐标轴 plt.show() # 输出df_user.query("总分 == 7")

至此,发现一共有8个“最有价值用户”!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有